package org.erp.admins.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.erp.admins.infrastructure.convert.StoreInfoConvert;
import org.erp.admins.domain.dto.StoreInfoDto;
import org.erp.admins.domain.vo.StoreInfoVo;
import org.erp.admins.infrastructure.mapper.StoreInfoMapper;
import org.erp.admins.domain.entity.StoreInfo;
import org.erp.admins.service.StoreInfoService;
import org.erp.common.page.PageQueryModel;
import org.springframework.stereotype.Service;
import org.springframework.util.Assert;
import org.springframework.util.StringUtils;

import javax.annotation.Resource;
import java.util.List;
import java.util.stream.Collectors;

/**
 * 质检仓库信息(StoreInfo)表服务实现类
 *
 * @author dingding
 * @since 2025-11-24 13:47:55
 */
@Service("storeInfoService")
public class StoreInfoServiceImpl extends ServiceImpl<StoreInfoMapper, StoreInfo> implements StoreInfoService {

    @Resource
    private StoreInfoConvert storeInfoConvert;

    @Override
    public PageQueryModel<StoreInfoVo> getListByPage(StoreInfoDto storeInfoDto) {
        LambdaQueryWrapper<StoreInfo> queryWrapper = buildListQuery(storeInfoDto);
        Page<StoreInfo> page = this.page(storeInfoDto.buildPage(), queryWrapper);
        List<StoreInfoVo> voList = page.getRecords().stream()
                .map(storeInfoConvert::storeInfoToVo).collect(Collectors.toList());
        return PageQueryModel.of(page.getPages(), voList);
    }

    @Override
    public boolean updStoreInfo(StoreInfoDto storeInfoDto) {
        Assert.notNull(storeInfoDto.getId(), "ID不能为空");
        Assert.notNull(storeInfoDto.getStoreName(), "仓库名称不能为空");
        boolean exists=existsByName(storeInfoDto);
        Assert.isTrue(!exists, "仓库名称已存在");
        StoreInfo entity = storeInfoConvert.dtoToEntity(storeInfoDto);
        return this.updateById(entity);
    }

    @Override
    public boolean addStoreInfo(StoreInfoDto storeInfoDto) {
        Assert.notNull(storeInfoDto.getStoreName(), "仓库名称不能为空");
        boolean exists=existsByName(storeInfoDto);
        Assert.isTrue(!exists, "仓库名称已存在");
        StoreInfo entity = storeInfoConvert.dtoToEntity(storeInfoDto);
        return this.save(entity);
    }

    @Override
    public StoreInfoVo getStoreInfoVoById(Long id) {
        StoreInfo storeInfo = this.getById(id);
        if (storeInfo != null) {
            return storeInfoConvert.storeInfoToVo(storeInfo);
        }
        return null;
    }

    @Override
    public List<StoreInfoVo> getStoreInfoVoList(StoreInfoDto storeInfoDto) {
        LambdaQueryWrapper<StoreInfo> queryWrapper = buildListQuery(storeInfoDto);
        List<StoreInfo> storeInfoList = this.list(queryWrapper);
        List<StoreInfoVo> storeInfoVoList = storeInfoList.stream().map(storeInfoConvert::storeInfoToVo).collect(Collectors.toList());
        return storeInfoVoList;
    }


    private LambdaQueryWrapper<StoreInfo> buildListQuery(StoreInfoDto storeInfoDto) {
        LambdaQueryWrapper<StoreInfo> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.eq(StringUtils.hasText(storeInfoDto.getStoreName()), StoreInfo::getStoreName, storeInfoDto.getStoreName())
                .eq(StoreInfo::getDelFlag, 0)
                .orderByDesc(StoreInfo::getCreateTime);
        return queryWrapper;
    }

    private boolean existsByName(StoreInfoDto storeInfoDto) {
        LambdaQueryWrapper<StoreInfo> wrapper = new LambdaQueryWrapper<>();
        wrapper.eq(StoreInfo::getStoreName, storeInfoDto.getStoreName())
                .eq(StoreInfo::getDelFlag, 0);
        wrapper.eq(storeInfoDto.getTenantId() != null,StoreInfo::getTenantId, storeInfoDto.getTenantId());
        wrapper.ne(storeInfoDto.getId() != null,StoreInfo::getId, storeInfoDto.getId());
        return this.count(wrapper) > 0;
    }


}
